package com.locatme.model;

import java.util.Iterator;
import java.util.List;

import com.google.android.gms.maps.model.LatLng;


public abstract class Utilisateur {
    private String login;
    private String pwd;
    private String statut;
    private Double note;
    private List<Langue> mesLangues=null;
    private List<Note> mesNotes;
    private List<Message> messEnvoye;
    private List<Message> messRecus;
    private List<Commentaire> mesCommentaires;
    private LatLng localisation;


    public void setMessEnvoye(List<Message> messEnvoye) {
        this.messEnvoye = messEnvoye;
    }

    public void setMessRecus(List<Message> messRecus) {
        this.messRecus = messRecus;
    }

    public void setMesCommentaires(List<Commentaire> mesCommentaires) {
        this.mesCommentaires = mesCommentaires;
    }

    protected Utilisateur(){}

    protected Utilisateur(String login, String pwd) {
        this.login = login;
        this.pwd = pwd;
        //Action base de donnée pour récuperer le reste.
    }

    public Utilisateur(String login, String pwd, List<Langue> langues, LatLng loca) {
        // TODO Auto-generated constructor stub
        this.setLogin(login);
        this.setPwd(pwd);
        this.setMesLangues(langues);
        this.setLocalisation(loca);
    }
    /**
     * Ajoute une langue à la liste des langues de l'utilisateur.
     * @param loc   La nouvelle localisation de l'utilisateur (peut être vide).
     * @param txtStatut  Le nouveau message de profil (peut être vide)
     */
    public abstract void majProfil(Localisation loc, String txtStatut);

    /**
     * Ajoute une langue à la liste des langues de l'utilisateur.
     * @param lng   La nouvelle langue à ajouter.
     * @return vrai(true) si la langue à bien été ajoutée, faux sinon
     */
    public boolean ajoutLangue(Langue lng){

        return this.getMesLangues().add(lng);

    }

    /**
     * Ajoute une langue à la liste des langues de l'utilisateur.
     * @param lng   La nouvelle langue à ajouter.
     * @return vrai(true) si la langue à bien été supprimée, faux sinon
     */
    public boolean suprimerLangue(Langue lng){

        return this.getMesLangues().remove(lng);

    }

    /**
     * Envoi un message à l'utilisateur désigné.
     * @param destinataire   L'objet désignant la personne qui recevra ce message.
     * @return vrai(true) si le message à bien été envoyé, faux sinon
     */
    public boolean envoyerMessage(Utilisateur destinataire, Message msg){

        return this.getMessEnvoye().add(msg);

    }

    /**
     * Ajoute une note à la liste des note attribuées de l'utilisateur.
     * @param note   La note à attribuer.
     */
    public boolean noter(Note note){

        return this.getMesNotes().add(note);


    }

    /**
     * Met à jour la note générale de l'utilisateur.
     */
    public void majnote(){
        double somme = 0.0;
        int curNote;

        for(Note note : getMesNotes()) {
            curNote=note.ordinal()+1;
            somme = somme + curNote; //int i = Enumeration.DEUX.ordinal() // i==1
        }

        this.note = somme / getMesNotes().size();

    }

    /**
     * Met à jour la liste des commentaires.
     */
    public void majCom(){
        //Action base de données
    }

    /**
     * Met à jour la liste des message envoyé
     */
    public void majMess(){
        //Action base de données
    }




    //methode qui crer une chaine en fonction des langues de l'utilisateur (pour les markers)
    public String getAffLangues() {
        Iterator<Langue> i;
        Langue langue;
        String langues="";
        if(getMesLangues()!=null){
            i = getMesLangues().iterator();

            while(i.hasNext()){
                langue = i.next();
                if(langues.equals("")){
                    langues = langue.getNomLangue();
                }
                else{
                    langues = langues+", "+langue.getNomLangue();
                }
            }
        }
        return langues;
    }

    public String getStatut() {
        return statut;
    }

    public Double getNote() {
        return note;
    }

    public List<Langue> getMesLangues() {
        return mesLangues;
    }

    public List<Note> getMesNotes() {
        return mesNotes;
    }

    public List<Message> getMessEnvoye() {
        return messEnvoye;
    }

    public List<Message> getMessRecus() {
        return messRecus;
    }

    public List<Commentaire> getMesCommentaires() {
        return mesCommentaires;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public void setStatut(String statut) {
        this.statut = statut;
    }

    public void setNote(Double note) {
        this.note = note;
    }

    public LatLng getLocalisation() {
        return localisation;
    }

    public void setLocalisation(LatLng localisation) {
        this.localisation = localisation;
    }

    public void setMesNotes(List<Note> mesNotes) {
        this.mesNotes = mesNotes;
    }

    public void setMesLangues(List<Langue> mesLangues) {
        this.mesLangues = mesLangues;
    }
}
